Listing: CINEMA.CPP #include<stdio.h> #include<mem.h> #include<process.h> int n,a[1001],all2=1,v[1001],total[3],MAX=0; FILE *f; void citire(){
f=fopen("CINEMA.IN","r");
fscanf(f,"%d",&n); for(int i=1;i<=n;i++) fscanf(f,"%d",&a[i]); fclose(f); } void identica(){
memset(v,0,sizeof(v)); int da=1; for(int i=1;i<=n;i++) if(a[i]!=i) da=0; else v[i]=1; if (da){
f=fopen("cinema.out","w");
fprintf(f,"0"); fclose(f); exit(0); } } void gaseste_ciclu(int k){
v[k]=1; int i=a[k],lung=1; while (i!=k) v[i]=1,i=a[i],lung++; if (lung>2) all2=2; total[1]+=lung/2; total[2]+=(lung-1)/2; } void prelucreaza_ciclu(int k){
int c[1001],i=a[k],lung=1; v[k]=1; c[lung]=k; while (i!=k) c[++lung]=i,v[i]=1,i=a[i]; for(i=1;i<=lung/2;i++){
fprintf(f,"%d %d\n",c[i],c[lung-i+1]); int aux=a[c[i]]; a[c[i]]=a[c[lung-i+1]]; a[c[lung-i+1]]=aux; } if (lung>MAX) MAX=lung; } void prelucrare(){
total[1]=total[2]=0; for (int i=1;i<=n;i++) if (!v[i]) gaseste_ciclu(i); f=fopen("cinema.out","w");
fprintf(f,"%d\n",all2); for (int pas=1;pas<=all2;pas++){
fprintf(f,"%d\n",total[pas]); memset(v,0,sizeof(v)); for (i=1;i<=n;i++) if (!v[i]) prelucreaza_ciclu(i); } fclose(f); printf("%d\n",MAX);
} void main(){
citire(); identica(); prelucrare(); } [cuprins] |